﻿#ifndef __SS_TRANSFORM_H__
#define __SS_TRANSFORM_H__
#include "ssComponent.h"
#include "../3dMath/ssMatrix.h"
#include "../3dMath/ssVector.h"
#include "../3dMath/ssQuaternion.h"

//顶点变换
#define SS_TF_ZOOM				1	//启用缩放
#define SS_TF_ROTATE			2	//启用旋转
#define SS_TF_MOVE				4	//启用平移

namespace StarSeeker
{

class ssTransform : public ssComponent
{
public:
	ssTransform();
	~ssTransform();
	//获取父节点
	ssTransform* Parent();
	//获取子节点
	ssTransform* FindChild(const char* name);
	ssTransform* FindChild(u32 offset);
	//设置平移坐标(本地坐标系)
	void SetPosition(ssfloat x, ssfloat y, ssfloat z);
	void SetPosition(const ssFLOAT3X& v);
	ssFLOAT3X GetPosition();
	//设置旋转(本地坐标系)
	void SetRotation(const ssFLOAT4X& qt);
	ssFLOAT4X GetRotation();
	//设置缩放(本地坐标系)
	void SetScaling(ssfloat x, ssfloat y, ssfloat z);
	void SetScaling(const ssFLOAT3X& v);
	ssFLOAT3X GetScaling();
	//获取本地旋转坐标轴3方向
	ssFLOAT3X Up();
	ssFLOAT3X Left();
	ssFLOAT3X Forward();
	//获取视图矩阵
	ssFLOAT4x4X& ViewMatrix(bool isGlobal=true);
	//计算全局矩阵，父节点变更后要调用
	void UpdateGlobalMatrix();
	//标记检测
	bool HasFlag(u8 f);
	bool hasDirty();
	//计算视图矩阵
	void ComputeViewMatrix();
	//更新子节点
	void UpdateChildren();
protected:
	ssFLOAT4x4X		m_matView[2];		//视图矩阵,0本地变换,1全局变换
	ssFLOAT3X		m_vZoom;			//缩放
	ssFLOAT4X		m_vRotate;			//旋转
	ssFLOAT3X		m_vMove;			//平移，0本地坐标系，1世界坐标系
	u8				m_transformFlag;	//变换标记
	bool			m_transformDirty;	//变换计算标记
};

}
#endif
